/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.dmz.sig.web.controlador;

import ec.dmz.seguridad.ejb.dto.EntityOpcion;
import ec.dmz.seguridad.ejb.model.Usuario;
import ec.dmz.seguridad.ejb.model.UsuarioPerfil;
import ec.dmz.seguridad.ejb.servicio.OpcionServicio;
import ec.dmz.seguridad.ejb.servicio.UsuarioServicio;
import ec.dmz.sig.web.utilitarios.ClaveEncriptada;
import ec.dmz.sig.web.utilitarios.Utilitarios;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;

/**
 *
 * @author Estiwar
 */
@ManagedBean
@SessionScoped
public class NavegacionControlador extends Utilitarios implements Serializable {

    @EJB
    private UsuarioServicio usuarioServicio;
    @EJB
    private OpcionServicio opcionServicio;
    private ClaveEncriptada claveEncriptada = new ClaveEncriptada();
    private Usuario usuarioSeguridad;
    private UsuarioPerfil usuarioPerfil;
    private String devuelveFechaSistema;
    private String login;
    private String password;
    private MenuModel model;
    private List<UsuarioPerfil> listaUsuarioPerfil;
    private List<SelectItem> tipoDispositivos;

    @PostConstruct
    public void cargarDatos() {
        this.setDevuelveFechaSistema(devuelveFechaEnLetrasSinHora(new Date()));
    }

    public void verPrincipal() throws Exception {
        switch (validarIngreso()) {
            case 2:
                cargarOpcionesDinamicas();
                this.usuarioPerfil = this.listaUsuarioPerfil.get(0);
                this.usuarioSeguridad = this.usuarioPerfil.getUsuCodigo();
                redirect("/home.jsf");
                break;
            case 3:
                ponerMensajeError(NADA, "Usuario no existente o login/password incorrectos");
                break;
            case 4:
                ponerMensajeError(NADA, "El Usuario no tiene un perfil asociado");
                break;
        }
    }

    private int validarIngreso() {
        try {
            Usuario usuario = usuarioServicio.obtenerUsuario(this.getLogin(), claveEncriptada.claveEncriptada(getPassword()));
            if (usuario == null) {
                return 3;
            } else if (usuario.getUsuarioPerfilList() != null && !usuario.getUsuarioPerfilList().isEmpty()) {
                this.listaUsuarioPerfil = usuarioServicio.obtenerPerfilUsuario(usuario);
                if (this.listaUsuarioPerfil != null && !this.listaUsuarioPerfil.isEmpty()) {
                    return 2;
                }
            }
            return 4;
        } catch (Exception e) {
            error(getClass().getName(), "no se puede", e);
            return 3;
        }
    }

    private void cargarOpcionesDinamicas() {
        try {
            List<EntityOpcion> listaTodos = opcionServicio.listarPorUsuarioPerfil(this.listaUsuarioPerfil);
            this.model = new DefaultMenuModel();          
            for (EntityOpcion opcion : listaTodos) {
                if ((opcion.getIdOpcionPadre() == null) && opcion.getNivel() == 1) {
                    Submenu subOpcion = new Submenu();
                    subOpcion.setIcon("ui-icon-circle-plus");
                    subOpcion.setLabel(opcion.getEtiquetaOpcion());
                    cargarHijos(opcion, listaTodos, subOpcion, null);
                    this.model.addSubmenu(subOpcion);
                }              
            }
        } catch (Exception e) {
            ponerMensajeError(NADA, "No se puede generar menú dinámico favor revise el log.");
            error(getClass().getName(), "no se puede generar opcion dinamico", e);
        }
    }

    private MenuItem cargarHijos(EntityOpcion men, List<EntityOpcion> listaTodos, Submenu opcionPadre, MenuItem opcionItem) {
        try {
            for (EntityOpcion opcion : listaTodos) {
                if ((men.getIdOpcion() == opcion.getIdOpcionPadre()) && (men.getNivel() + 1 == opcion.getNivel())) {
                    Submenu subOpcion = new Submenu();
                    subOpcion.setIcon("ui-icon-circle-plus");
                    subOpcion.setLabel(opcion.getEtiquetaOpcion());
                    cargarHijos(opcion, listaTodos, subOpcion, opcionItem);
                    if (subOpcion.getChildCount() > 0) {
                        opcionPadre.getChildren().add(subOpcion);   
                    } else {
                        MenuItem opcionItem1 = new MenuItem();
                        opcionItem1.setValue(opcion.getEtiquetaOpcion());
                        opcionItem1.setUrl(opcion.getActionOpcion());
                        opcionItem1.setIcon("ui-icon ui-icon-document");
                        opcionPadre.getChildren().add(opcionItem1);
                    }
                }
            }
            return opcionItem;
        } catch (Exception e) {
            error(getClass().getName(), "", e);
            return null;
        }
    }

    public void cerrarSesion() {
        try {
            closeSession();
        } catch (Exception e) {
            error(getClass().getName(), "no se puede cerrar sesion", e);
        }
    }

    /**
     * @return the usuarioSeguridad
     */
    public Usuario getUsuarioSeguridad() {
        return usuarioSeguridad;
    }

    /**
     * @param usuarioSeguridad the usuarioSeguridad to set
     */
    public void setUsuarioSeguridad(Usuario usuarioSeguridad) {
        this.usuarioSeguridad = usuarioSeguridad;
    }

    /**
     * @return the devuelveFechaSistema
     */
    public String getDevuelveFechaSistema() {
        return devuelveFechaSistema;
    }

    /**
     * @param devuelveFechaSistema the devuelveFechaSistema to set
     */
    public void setDevuelveFechaSistema(String devuelveFechaSistema) {
        this.devuelveFechaSistema = devuelveFechaSistema;
    }

    /**
     * @return the login
     */
    public String getLogin() {
        return login;
    }

    /**
     * @param login the login to set
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the model
     */
    public MenuModel getModel() {
        return model;
    }

    /**
     * @param model the model to set
     */
    public void setModel(MenuModel model) {
        this.model = model;
    }

    public List<SelectItem> getTipoDispositivos() {
        return tipoDispositivos;
    }

    public void setTipoDispositivos(List<SelectItem> tipoDispositivos) {
        this.tipoDispositivos = tipoDispositivos;
    }
}
